// 登录注册接口

// 导入编写的mysql，执行模块
const db = require("../db");

// 引入 jswebtoken 模块
const jwt = require("jsonwebtoken");

// 引入utility 模块
// const utils = require('utility');
let { md5 } = require('utility');

// 1.导入express 模块
const express = require("express");

// 2.创建路由对象, 实则是一个函数类型
const router = express.Router();

// 3.编写接口，将接口挂载到 router 上
// 将之前写的 app.get|post 改为 router.get|post



// 在注册和登录之前，使用中间件验证客户端发送的数据、
router.use((req,res,next) => {
    // 获取用户名和密码
    let { username, password } = req.body;

    // 验证用户名是否合法 , 以字母开头，只能包含数字、下划线、字母，长度在 3~10之间
    if (!/^[a-zA-Z][0-9a-zA-Z_]{3,10}$/.test(username)) {
        // 不合法, 将请求直接交给错误中间件处理
        next('用户名不合法，只能包含数字下划线字母，长度在 3~10之间，必须以字母开头');   
    } else if (!/^\S{4,12}$/.test(password)) {
        // 验证密码长度必须在 4-12位, 并且不能包含空格
        next('密码长度4-10位，不能出现空格');
    } else {
        // 合法，让请求交给下一个中间件处理
        next();
    }
    
})


/**
 * 注册接口
 * 请求方式: POST
 * 接口地址: /api/reguser
 *  - 中间间已经写了 /api，所以这些直接写/reguser
 * 请求体: username | password
 * 
 */
 router.post('/reguser', (req, res) => {
    // 1. 接受请求数据(客户端提交的数据)
    // 包含请求正文中提交的键值对数据。默认情况下，是undefined
    // console.log(req.body); // { username: 'admin', password: '1234' }

    // 获取请求参数中的 username 和 password 参数数据
    // let username = req.body.username;
    // let password = req.body.password;
    let { username, password } = req.body;
    
    // 使用 md5 对密码进行加密
    password = md5(password);
    db(`select * from user where username='${username}'`, (err, result) => {
        if (err) throw err;

        // 2. 判断账号是否被使用 ，根据客户端提交到用户名，查询到了数据，说明用户名已经被使用了
        // 查询到数据会返回一个数组（包含对象），
        // 没查询到返回一个空数组
        if (result.length > 0) {
            res.send({ code: 200, msg: '用户名已被使用' });
        } else {
            // 3. 用户名未被注册，将用户名和密码添加到数据库
            db(`insert into user set username='${username}',password='${password}'`, (e, r) => {
                if (e) throw e;
                res.send({ code: 200, msg: '注册成功' });
            })
        }
    });
});


/**
 * 登录接口
 * 请求方式: POST
 * 接口地址: /api/login
 *  - 中间间已经写了 /api，所以这些直接写/login
 * 请求体: username | password
 * 
 */
 router.post('/login', (req, res) => {
    // 1. 接受客户端提交的数据
    let { username, password } = req.body;
    // console.log(req.body); //{ username: 'admin', password: '123456' }

    password = md5(password);
    // 2. 将接受的用户名和密码，与数据库比对，查看用户名密码是否错误 (密码要进行加密对比)
    let sql = `select * from user where username='${username}' and password='${password}'`;
    db(sql, (err, result) => {
        if (err) throw err;

        // 判断该用户名密码是否正确
        if (result.length > 0) {
            // 登录成功，生成token, 必须拼接 Bearer 字符串，注意后面有空格
            // 参数一： 在token中保存用户的id 
            // 参数二： 加密钥匙，后续解密token的时候需要使用（随便填写）
            // 参数三： 设置了token的有效期
            let token = 'Bearer ' + jwt.sign({ id: result[0].id }, "yyds", { expiresIn: '2h' });

            res.send({ code: 200, msg: '登录成功',token });
        } else {
            res.send({ code: 402, msg: '用户名或密码错误' });  
        }
    })
})



// 错误处理中间件, 必须是四个参数
router.use((err, req, res, next) => {
    // err 的值时，next()里的参数值
    res.send({ code: 400, msg: err});
})



// 4.导出路由对象(函数)
module.exports = router;